﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using FastOdonto.Data.Entity;
using System.Data;
using System.Data.Linq;
using System.Data.Entity;

namespace Contract.Data.Manager
{
    public class DMCliente : DMGeneric<BECliente, FECliente>
    {
        DBFastOdontoEntities2 dc;
        
        #region Override

        public override BECliente Salvar(BECliente entidade)
        {
            try
            {
                if (entidade.Codigo.Equals(0))
                    Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BECliente entidade)
        {
            try
            {
                TBCliente entidadeBanco = new TBCliente();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBClientes.Attach(entidadeBanco);
                    dc.DeleteObject(entidadeBanco);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BECliente ObterEntidade(int codigo)
        {
            try
            {
                TBCliente obj = null;
                using (dc = new DBFastOdontoEntities2())
                {
                    obj = dc.TBClientes.Single(q => q.IDCliente.Equals(codigo));
                    return obj.ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BECliente> ObterTodos(FECliente filter)
        {
            try
            {
                List<TBCliente> tbCliente = null;
                using (dc = new DBFastOdontoEntities2())
                {

                    var q = from e in dc.TBClientes
                            where
                            (
                                (String.IsNullOrEmpty(filter.Nome) || e.NOCliente.Contains(filter.Nome)) &&
                                (!filter.Bloqueado.HasValue || e.STBloqueado.Equals(filter.Bloqueado.Value)) &&
                                (String.IsNullOrEmpty(filter.TelResidencial) || e.TelResidencial.Contains(filter.TelResidencial)) &&
                                (String.IsNullOrEmpty(filter.TelCelular) || e.TelCelular.Contains(filter.TelCelular)) &&
                                (String.IsNullOrEmpty(filter.Email) || e.Email.Contains(filter.Email)) &&
                                (!filter.NascimentoMax.HasValue || e.DTNascimento <= filter.NascimentoMax.Value) &&
                                (!filter.NascimentoMin.HasValue || e.DTNascimento >= filter.NascimentoMin.Value)
                            )
                            select e;

                    tbCliente = q.ToList();

                    List<BECliente> retorno = new List<BECliente>();

                    foreach (TBCliente de in tbCliente)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        private void Incluir(BECliente entidade)
        {
            try
            {
                
                using (dc = new DBFastOdontoEntities2())
                {
                    TBCliente de = new TBCliente();
                    de.ConvertFromBE(entidade);

                    dc.SaveChanges();

                    entidade.Codigo = de.IDCliente;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BECliente entidade)
        {
            try
            {
                TBCliente entidadeBanco = new TBCliente();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBClientes.Attach(entidadeBanco);
                    dc.ObjectStateManager.ChangeObjectState(entidadeBanco, EntityState.Modified);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
